SEI CERT Oracle Coding Standard for Java
00入力値檢査とデータの無害化 (IDS)
IDS00-J SQL インジェクションを防ぐ
IDS01-J 文字列は檢査するまえに標準化する
IDS02-J パス名は檢證する前に正規化する
IDS03-J ユーザ入力を無害化せずにログに保存しない
IDS04-J ZipInputStream からファイルを安全に展開する
IDS05-J ファイル名やファイルパスにはASCII文字セットの一部の文字のみを使用する
IDS06-J ユーザからの入力を使って書式を組み立てない
IDS07-J 信賴できない、無害化されていないデータを Runtime.exec() メソッドに渡さない
IDS08-J 信賴できないデータは regex に渡す前に無害化する
IDS09-J 適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない
IDS10-J 一文字を構成するデータを分割しない
IDS11-J 非文字コードポイントは檢證を行う前に削除する
IDS12-J 異なる文字コードへの文字列データの變換はデータが缺損しないように行う
IDS13-J ファイル入出力やネットワーク入出力の兩端で互換性のある文字エンコーディングを使う
01宣言と初期化 (DCL)
DCL00-J クラスの初期化を循環させない
DCL01-J Java標準ライブラリが使用するパブリック宣言された識別子を再利用しない
DCL02-J 擴張 for 文のループ變數は必ず final 宣言する
02式 (EXP)
EXP00-J メソッドの返り値を無視しない
EXP01-J null ポインタ參照しない
EXP02-J 配列の中身を比較するには2引數の Arrays.equals() メソッドを使う
EXP03-J ボクシングされたプリミティブ型の値の比較に等値演算子を使わない
EXP04-J オートボクシングされた値が想定した型を持つようにする
EXP05-J ひとつの式の中で同じ變數に2囘以上書込みを行わない
EXP06-J アサーションに副作用を持つ式を使わない
03數値型とその操作 (NUM)
NUM00-J 整數オーバーフローを檢出あるいは防止する
NUM01-J 同一のデータに対してビット演算と算術演算の兩方を行わない
NUM02-J 除算と剩餘演算でゼロ除算エラーを起こさない
NUM03-J 符號無しデータのとり得る値をすべて表現できる整數型を使う
NUM04-J 正確な計算が必要なときは浮動小數點數を使わない NUM05-J 非正規化數を使用しない
NUM06-J どのプラットフォームでも一貫した浮動小數點數演算を行うために strictfp 修飾子を使う NUM07-J NaNとの比較を行わない
NUM09-J 浮動小數點數型變數をループカウンタとして使用しない NUM10-J 浮動小數點數リテラルから BigDecimal クラスのオブジェクトを生成しない NUM11-J 浮動小數點數の文字列表現を比較したり內容を調べたりしない NUM12-J 數値型の縮小變換時にデータの缺損や誤解釋を引き起こさない
NUM13-J プリミティブ整數を浮動小數點數に變換する際、精度を低下させない 04オブジェクト指向 (OBJ)
OBJ00-J 不變條件を持つクラスやメソッドの擴張は信賴できるサブクラスのみに許す
OBJ01-J データメンバはprivate宣言し、それにアクセスするためのラッパーメソッドを提供する
OBJ02-J スーパークラスに變更を加える場合、サブクラスの依存性を保つ
OBJ03-J ジェネリックな未加工型とジェネリックでない未加工型を新規コードに混在させない
OBJ04-J 信賴できないコードにインスタンスを安全に渡すため、可變クラスにはコピー機能を實裝する
OBJ05-J privateかつ可變なクラスメンバへの參照を返す前にそのディフェンシブコピーを作成する
OBJ06-J 可變入力や可變な內部コンポーネントはディフェンシブコピーを作成する
OBJ07-J センシティブなクラスはコピーさせない
OBJ08-J 入れ子クラスから外側のクラスのprivateメンバを公開しない
OBJ09-J クラス名を比較するのではなくクラスを比較する
OBJ10-J public static 變數を final 宣言せずに使わない
OBJ11-J コンストラクタが例外をスローする場合には細心の注意を拂う
05メソッド (MET)
MET00-J メソッドの引數を檢證する
MET01-J メソッドの引數の檢證にassertを使わない
MET02-J 非推奬(deprecated)あるいは廢止された(obsolete)クラスやメソッドを使用しない
MET03-J セキュリティチェックを行うメソッドは private もしくは final 宣言する
MET04-J メソッドをオーバーライドあるいは隱蔽するときにアクセス範圍を廣げない
MET05-J コンストラクタにおいてオーバーライド可能なメソッドを呼び出さない
MET06-J clone() からオーバーライド可能なメソッドを呼び出さない
MET07-J スーパークラスやスーパーインタフェースで宣言されているメソッドを隱蔽するようなクラスメソッドを宣言しない
MET08-J equals() メソッドをオーバーライドする時は等價性に關する契約を守る
MET09-J equals() メソッドを實裝するクラスでは hashCode() メソッドも實裝する
MET10-J compareTo() メソッドを實裝する場合メソッドの一般契約に從う
MET11-J 比較演算に用いるキーは不變にする
MET12-J ファイナライザは使わない
06例外時の動作 (ERR)
ERR00-J チェック例外を抑制あるいは無視しない
ERR01-J センシティブな情報を例外によって外部に漏えいしない
ERR02-J ログ保存中の例外發生を防ぐ
ERR03-J メソッドが處理に失敗した場合はオブジェクトの狀態を元に戾す
ERR04-J finally ブロックの處理を途中で終了しない
ERR05-J チェック例外を finally ブロックの外に傳播させない
ERR06-J 宣言されていないチェック例外をスローしない
ERR07-J RuntimeException, Exception, Throwable をスローしない
ERR08-J NullPointerException およびその親クラスの例外をキャッチしない
ERR09-J 信賴できないコードにJVMを終了させない
07可視性とアトミック性 (VNA)
VNA00-J 共有プリミティブ型変數の可視性を確保する
VNA01-J 不變オブジェクトへの共有參照の可視性を確保する
VNA02-J 共有変數への複合操作のアトミック性を確保する
VNA03-J アトミックなメソッドをまとめた呼び出しがアトミックであると假定しない
VNA04-J メソッドチェーン呼出しのアトミック性を確保する
VNA05-J 64ビット値の讀み書きはアトミックに行う
08ロック (LCK)
LCK00-J 信賴できないコードから使用されるクラスを同期するにはprivate finalロックオブジェクトを使用する
LCK01-J 再利用されるオブジェクトを使って同期しない
LCK02-J getClass() メソッドが返す Class オブジェクトを同期に使用しない
LCK03-J 高水準な竝行處理オブジェクトの固有ロックを使って同期を行わない
LCK04-J 基になるコレクションにアクセス可能な場合にはコレクションビューを使って同期しない
LCK05-J 信賴できないコードによって變更されうる static フィールドへのアクセスは同期する
LCK06-J 共有staticデータの保護にインスタンスロックを使用しない
LCK07-J デッドロックを囘避するためにロックは同一順序で要求および解放する
LCK08-J 例外發生時には保持しているロックを解放する
LCK09-J 途中で待機狀態になる可能性のある操作をロックを保持したまま實行しない
LCK10-J ダブルチェックロック手法を誤用しない
LCK11-J 一貫したロック方式を定めていないクラスを使用する場合、クライアントサイドロックを行わない
09スレッド API (THI)
THI00-J Thread.run() メソッドを直接呼び出さない
THI01-J ThreadGroup クラスのメソッドを使用しない
THI02-J 1つではなくすべての待ち狀態スレッドへ通知を行う
THI03-J wait() および await() メソッドは常にループ內部で呼び出す
THI04-J ブロックしているスレッドやタスクが確實に終了できるようにする
THI05-J スレッドの強制終了にThread.stop()メソッドを使用しない
10スレッドプール (TPS)
TPS00-J スレッドプールを使用しトラフィックの大量發生による急激なサービス低下を防ぐ
TPS01-J スレッド數に上限のあるスレッドプールで相互に依存するタスクを實行しない
TPS02-J スレッドプールにサブミットするタスクは割込み可能にする
TPS03-J スレッドプールで實行されるタスクを通知なしに異常終了させない
TPS04-J スレッドプールの使用時にはThreadLocal變數の再初期化を確實に行う
11スレッドの安全性に關する雜則 (TSM)
TSM00-J スレッドセーフなメソッドを、スレッドセーフでないメソッドでオーバーライドしない
TSM01-J オブジェクトの構築時にthis參照を逸出させない
TSM02-J クラスの初期化中にバックグラウンドスレッドを使用しない
TSM03-J 初期化が完了していないオブジェクトを公開しない
12入出力 (FIO)
FIO00-J 共有ディレクトリにあるファイルを操作しない
FIO01-J 適切なパーミッションを設定してファイルを作成する
FIO02-J ファイル關聯エラーを検知し、處理する
FIO03-J 一時ファイルはプログラムの終了前に削除する
FIO04-J 不要になったリソースは解放する
FIO05-J wrap() や duplicate() メソッドで作成したバッファを信賴できないコードにアクセスさせない
FIO06-J 1つの InputStream に対して複數のバッファ付きラッパーを作成しない
FIO07-J 外部プロセスに IO バッファをブロックさせない
FIO08-J 文字やバイトを讀み取るメソッドの返り値はintで受ける
FIO09-J 0から255の範圍に收まらない整數値を出力するときには write() メソッドを信用しない
FIO10-J read() を使って配列にデータを讀み込むときには配列への讀み込みが意圖した通りに行われたことを確認する
FIO11-J バイナリデータを文字データとして讀み込もうとしない
FIO12-J リトルエンディアン形式のデータを讀み書きするメソッドを用意する
FIO13-J センシティブな情報を信賴境界の外に記錄しない
FIO14-J プログラムの終了時には適切なクリーンアップを行う
13シリアライズ (SER)
SER00-J 開發中のクラスにおいてシリアライズの互換性を維持する
SER01-J シリアライズに關聯するメソッドは正しいシグネチャで實裝する
SER02-J センシティブなオブジェクトは信賴境界を越えて送信する前に署名し暗號化する
SER03-J 暗號化されていないセンシティブなデータをシリアライズしない
SER04-J シリアライズと復元においてセキュリティマネージャによるチェックをバイパスさせない
SER05-J 內部クラスのインスタンスをシリアライズしない
SER06-J 復元時には private 宣言された可變コンポーネントはディフェンシブコピーする
SER07-J 實裝上必要となる不變條件がある場合にはデフォルトのシリアライズ形式を使わない
SER08-J 特權を持ったコンテキストでは必要最小限の權限でオブジェクトを復元する
SER09-J オーバーライド可能なメソッドを readObject() メソッドから呼び出さない
SER10-J シリアライズの過程でメモリリークやリソースリークをしない
SER11-J Externalizable を實裝したオブジェクトの上書きを防ぐ
SER12-J 信賴できないクラスの復元はしない
SER13-J デシリアライズするデータは惡質なものという前提で處理する
14プラットフォームのセキュリティ (SEC)
SEC00-J センシティブな情報を特權ブロックから信賴境界を越えて漏えいさせない
SEC01-J 汚染された變數を特權ブロックの中で使わない
SEC02-J 信賴できない入力値に基づいてセキュリティチェックを行わない
SEC03-J 信賴できないコードに任意のクラスのロードを許可した後で信賴するクラスをロードしない
SEC04-J センシティブな處理はセキュリティマネージャによるチェックで保護する
SEC05-J リフレクションを使ってクラス、メソッド、フィールドのアクセス範圍を廣げない
SEC06-J URLClassLoader と java.util.jar が提供するデフォルトの署名自動檢證機能に賴らない
SEC07-J クラスローダを獨自に實裝する場合スーパークラスの getPermissions() メソッドを呼び出す
SEC08-J ネイティブメソッドにはラッパーメソッドを定義する
15實行環境 (ENV)
ENV00-J 特權の必要ない動作のみを行うコードを署名しない
ENV01-J セキュリティ上重要なコードは署名附きの1つの JAR にまとめてシールする
ENV02-J 環境變數の値を信賴しない
ENV03-J 危險な組み合わせのパーミッションを割り當てない
ENV04-J バイトコード檢證機能を無效にしない
ENV05-J 遠隔から監視できる狀態のままアプリケーションを實運用しない
49雜則 (MSC)
MSC00-J セキュアなデータ交換には Socket クラスではなく SSLSocket クラスを使用する
MSC01-J 空の無限ループを使用しない
MSC03-J センシティブな情報をハードコードしない
MSC04-J メモリリークしない
MSC05-J ヒープメモリを使い果たさない
MSC06-J 繰り返し處理中に基となるコレクションを變更しない
MSC07-J シングルトンオブジェクトのインスタンスを複數作らない